package com.sjh.baseui.picture

import android.content.Context
import android.widget.ImageView
import androidx.annotation.DrawableRes
import com.blankj.utilcode.util.FileUtils
import com.sjh.baseui.R
import java.io.File

/**
 * 图片加载组件
 * @author Extends
 * @date 2020/7/8
 */
object LibPicture{
    /**
     * img网络图片的域名，默认为null，也不推荐使用
     * 正确的做法是由服务器组装成绝对路径
     * 该字段仅仅是为了兼容非要使用相对路径的情况
     */
    private var IMG_DOMAIN : String? = null

    /**
     * 默认的全局占位图
     * 现在不支持配置默认的错误图，因为我们认为如果图片加载失败了，就直接显示占位图吧 =￣ω￣=
     */
    internal var PLACEHOLDER : Int = R.mipmap.icon_error

    /**
     * 内部使用的 application context
     */
    internal lateinit var APPLICATION_CONTEXT : Context


    /**
     * 图片加载组件的初始化
     *
     * @param context 上下文
     * @param imgDomain 统一的图片域名，不推荐使用
     * @param placeHolder 统一的占位图
     */
    fun init(context: Context,imgDomain:String?=null,@DrawableRes placeHolder:Int = 0){
        APPLICATION_CONTEXT = context.applicationContext
        IMG_DOMAIN = imgDomain
        PLACEHOLDER = placeHolder
    }

    /**
     * 获取图片保存的路径
     */
    @JvmStatic
    fun getSavePath(context: Context) = context.cacheDir.absolutePath + File.separatorChar + "libPictureCache" + File.separator

    /**
     * 获取处理过后的地址
     */
    private fun getImagePath(path:Any?):Any{
        if(path == null) return ""
        if(path !is String) return path
        if(path.isEmpty()) return ""
        if(path.startsWith("http://") || path.startsWith("https://")) return path
        if(FileUtils.isFileExists(path)) return path

        //剩下的可能性就是相对路径的网络图片了
        if(IMG_DOMAIN == null) return path

        //获取没有/结尾的域名
        val domain = if(IMG_DOMAIN!!.endsWith("/")){
            IMG_DOMAIN!!.substring(0,
                IMG_DOMAIN!!.length-1)
        }else IMG_DOMAIN!!

        val url = if(path.startsWith("/")){
            path.substring(1)
        }else path

        return "$domain/$url"
    }


    /**
     * 加载图片
     *
     * @param view 要显示的控件
     * @param imgPath 要加载的图片，可能是网络图片地址，可能是本地图片地址，也可能是本地图片文件，也可能是图片资源id
     * @param any 被依赖的生命周期，可以是Activity，fragment，view等
     * @param build 图片构造器
     */
    fun showImage(view:ImageView,imgPath:Any?,any: Any? = view,build: ImageBuild?=null){
        BuildImage.showImageFromGlide(
            view,
            getImagePath(imgPath),
            any,
            build ?: ImageBuild.build()
        )
    }
}

/**
 * 加载图片的拓展方法
 *
 * @param url 要加载的图片，可能是网络图片地址，可能是本地图片地址，也可能是本地图片文件，也可能是图片资源id
 * @param any 被依赖的生命周期，可以是Activity，fragment，view等
 * @param build 图片构造器
 */
fun ImageView.loadUrl(url: Any,any: Any? = this,build: ImageBuild?=null){
    LibPicture.showImage(this, url, any, build)
}


/**
 * 加载gif
 *
 * @param url 要加载的gif图片，可能是网络gif图片地址，可能是本地gif图片地址，也可能是本地图片gif文件，也可能是图片资源gif_id
 * @param any 被依赖的生命周期，可以是Activity，fragment，view等
 * @param count 需要gif播放循环的次数 默认为 一次
 */
fun ImageView.loadGif(url:Any,any: Any,count:Int=1){
    BuildImage.showGif(url, any, this, count)
}